package com.atguigu.gmall.index.aspect;

import org.apache.commons.lang.StringUtils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class GmallInvocationHandler implements InvocationHandler {
    private Object target;//用来接收目标对象
    public GmallInvocationHandler(Object target) {
        this.target = target;
    }
    //创建代理类对象的方法
    public static Object createProxy(Object target){//参数：目标对象
        //创建并返回代理类的对象：只要调用代理类对象的方法就会走GmallInvocationHandler的invoke方法
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),//获取目标对象的类加载器
                target.getClass().getInterfaces(), //获取目标对象的接口列表
                new GmallInvocationHandler(target)
                );
    }

    //增强方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //proxy:代理后的对象，没有用
//        method:将来代理的目标对象被调用的方法对象
        //args:目标对象被调用时传入的实参列表
        System.out.println(method.getName()+"被调用了,参数列表："+ StringUtils.join(args,","));

        //执行目标对象的被调用的方法
        Object result = method.invoke(target, args);//参数1：目标对象   参数2：方法参数列表

        System.out.println("执行结果："+ result);
        return result; //返回希望目标对象方法执行后返回的结果
    }
}
